home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / hardware / pas_src / keyboard.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-06-17  |  7.3 KB  |  265 lines

  1. {
  2. -----------------------------------------------------
  3. File:    Keyboard.Pas
  4. By:      Ronny Wester, ronny@rat.se
  5.  
  6. Unit to check up/down status of individual key flags.
  7. Written from code I got off rec.games.programmer.
  8. Sorry, I lost the name of the poster.
  9. As most of this code is scancode-dependent some keys
  10. may not be where they "should" on your keyboard.
  11. -----------------------------------------------------
  12. }
  13. unit Keyboard;
  14.  
  15.  
  16. interface
  17.  
  18.   uses Dos;
  19.  
  20.  
  21. const
  22.  
  23.   keySysReq      = $54;
  24.   keyCapsLock    = $3A;
  25.   keyNumLock     = $45;
  26.   keyScrollLock  = $46;
  27.   keyLeftCtrl    = $1D;
  28.   keyLeftAlt     = $38;
  29.   keyLeftShift   = $2A;
  30.   keyRightCtrl   = $9D;
  31.   keyAltGr       = $B8;
  32.   keyRightShift  = $36;
  33.   keyEsc         = $01;
  34.   keyBackspace   = $0E;
  35.   keyEnter       = $1C;
  36.   keySpace       = $39;
  37.   keyTab         = $0F;
  38.   keyF1          = $3B;
  39.   keyF2          = $3C;
  40.   keyF3          = $3D;
  41.   keyF4          = $3E;
  42.   keyF5          = $3F;
  43.   keyF6          = $40;
  44.   keyF7          = $41;
  45.   keyF8          = $42;
  46.   keyF9          = $43;
  47.   keyF10         = $44;
  48.   keyF11         = $57;
  49.   keyF12         = $58;
  50.   keyA           = $1E;
  51.   keyB           = $30;
  52.   keyC           = $2E;
  53.   keyD           = $20;
  54.   keyE           = $12;
  55.   keyF           = $21;
  56.   keyG           = $22;
  57.   keyH           = $23;
  58.   keyJ           = $24;
  59.   keyK           = $25;
  60.   keyL           = $26;
  61.   keyM           = $32;
  62.   keyN           = $31;
  63.   keyO           = $18;
  64.   keyP           = $19;
  65.   keyQ           = $10;
  66.   keyR           = $13;
  67.   keyS           = $1F;
  68.   keyT           = $14;
  69.   keyU           = $16;
  70.   keyV           = $2F;
  71.   keyW           = $11;
  72.   keyX           = $2D;
  73.   keyY           = $15;
  74.   keyZ           = $2C;
  75.   key1           = $02;
  76.   key2           = $03;
  77.   key3           = $04;
  78.   key4           = $05;
  79.   key5           = $06;
  80.   key6           = $07;
  81.   key7           = $08;
  82.   key8           = $09;
  83.   key9           = $0A;
  84.   key0           = $0B;
  85.   keyMinus       = $0C;
  86.   keyEqual       = $0D;
  87.   keyLBracket    = $1A;
  88.   keyRBracket    = $1B;
  89.   keySemicolon   = $27;
  90.   keyTick        = $28;
  91.   keyApostrophe  = $29;
  92.   keyBackslash   = $2B;
  93.   keyComma       = $33;
  94.   keyPeriod      = $34;
  95.   keySlash       = $35;
  96.   keyInsert      = $D2;
  97.   keyDelete      = $D3;
  98.   keyHome        = $C7;
  99.   keyEnd         = $CF;
  100.   keyPageUp      = $C9;
  101.   keyArrowLeft   = $CB;
  102.   keyArrowRight  = $CD;
  103.   keyArrowUp     = $C8;
  104.   keyArrowDown   = $D0;
  105.   keyKeypad0     = $52;
  106.   keyKeypad1     = $4F;
  107.   keyKeypad2     = $50;
  108.   keyKeypad3     = $51;
  109.   keyKeypad4     = $4B;
  110.   keyKeypad5     = $4C;
  111.   keyKeypad6     = $4D;
  112.   keyKeypad7     = $47;
  113.   keyKeypad8     = $48;
  114.   keyKeypad9     = $49;
  115.   keyKeypadComma = $53;
  116.   keyKeypadStar  = $37;
  117.   keyKeypadMinus = $4A;
  118.   keyKeypadPlus  = $4E;
  119.   keyKeypadEnter = $9C;
  120.   keyCtrlPrtScr  = $B7;
  121.   keyShiftPrtScr = $B7;
  122.   keyKeypadSlash = $B5;
  123.  
  124.   keyNames : array [0..255] of PChar =
  125.     ( { $00 } nil, 'Esc', '1', '2', '3', '4', '5', '6',
  126.       { $08 } '7', '8', '9', '0', '+', 'Apostrophe', 'Backspace', 'Tab',
  127.       { $10 } 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
  128.       { $18 } 'O', 'P', 'Å', '?', 'Enter', 'Left Ctrl', 'A', 'S',
  129.       { $20 } 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Ö',
  130.       { $28 } 'Ä', '''', 'Left shift', '<', 'Z', 'X', 'C', 'V',
  131.       { $30 } 'B', 'N', 'M', ',', '.', '-', 'Right shift', '* (pad)',
  132.       { $38 } 'Alt', 'Space', 'Caps Lock', 'F1', 'F2', 'F3', 'F4', 'F5',
  133.       { $40 } 'F6', 'F7', 'F8', 'F9', 'F10', 'Num Lock', 'Scroll Lock', '7 (pad)',
  134.       { $48 } '8 (pad)', '9 (pad)', '- (pad)', '4 (pad)', '5 (pad)', '6 (pad)', '+ (pad)', '1 (pad)',
  135.       { $50 } '2 (pad)', '3 (pad)', '0 (pad)', ', (pad)', 'SysRq', nil, nil, 'F11', 'F12',
  136.       { $59 } nil, nil, nil, nil, nil, nil, nil,
  137.       { $60 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
  138.       { $70 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
  139.       { $80 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
  140.       { $90 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 'Enter (pad)', 'Right Ctrl', nil, nil,
  141.       { $A0 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
  142.       { $B0 } nil, nil, nil, nil, nil, '/ (pad)', nil, 'PrtScr', 'Alt Gr', nil, nil, nil, nil, nil, nil, nil,
  143.       { $C0 } nil, nil, nil, nil, nil, nil, nil, 'Home',
  144.       { $C8 } 'Up arrow', 'Page Up', nil, 'Left arrow', nil, 'Right arrow', nil, 'End',
  145.       { $D0 } 'Down arrow', nil, 'Insert', 'Delete', nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
  146.       { $E0 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
  147.       { $F0 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil
  148.     );
  149.  
  150.  
  151. procedure InstallKbdHandler;
  152. procedure RemoveKbdHandler;
  153. function  KeyDown( b : byte ) : Boolean;
  154. function  AnyKeyDown : Boolean;
  155. function  GetKeyDown : Byte;
  156. procedure ClearKeys;
  157.  
  158.  
  159. implementation
  160.  
  161.  
  162. var
  163.  
  164.   uOldInt9  : Pointer;                   { saves location of old OldInt9 vector }
  165.   uKeys     : array [0..255] of Boolean; { array that holds key values }
  166.   e0Flag    : Byte;
  167.   uExitProc : Pointer;
  168.  
  169.  
  170. {$F+}
  171. procedure NewInt9; interrupt; assembler;
  172. asm
  173.   cli
  174.   in      al, $60                       { get scan code from keyboard port }
  175.   cmp     al, $E0                       { al = $E0 key ? }
  176.   jne     @@SetScanCode
  177.   mov     [e0Flag], 128
  178.   mov     al, 20h                       { Send 'generic' EOI to PIC }
  179.   out     20h, al
  180.   jmp     @@exit
  181. @@SetScanCode:
  182.   mov     bl, al                        { Save scancode in BL }
  183.   and     bl, 01111111b
  184.   add     bl, [e0Flag]
  185.   xor     bh, bh
  186.   and     al, 10000000b                 { keep break bit, if set }
  187.   xor     al, 10000000b                 { flip bit, 1 means pressed, 0 no }
  188.   rol     al, 1                         { move breakbit to bit 0 }
  189.   mov     [offset uKeys + bx], al
  190.   mov     [e0Flag], 0
  191.   mov     al, 20h                       { send EOI to PIC }
  192.   out     20h, al
  193. @@exit:
  194.   sti
  195. end;
  196. {$F-}
  197.  
  198.  
  199. procedure InstallKbdHandler;
  200. begin
  201.   GetIntVec( $09, uOldInt9);           { save old location of INT 09 handler }
  202.   SetIntVec( $09, Addr( NewInt9));     { point to new routine }
  203.   FillChar( uKeys, SizeOf( uKeys), 0); { clear the keys array }
  204. end;
  205.  
  206.  
  207. procedure RemoveKbdHandler;
  208. begin
  209.   SetIntVec( $09, uOldInt9);         { point back to original routine }
  210.   uOldInt9 := nil;
  211. end;
  212.  
  213.  
  214. function KeyDown( b : byte ) : Boolean;
  215. begin
  216.   KeyDown := uKeys[b];
  217. end;
  218.  
  219.  
  220. function AnyKeyDown : Boolean;
  221. var b : Integer;
  222. begin
  223.   AnyKeyDown := True;
  224.   for b := 0 to 255 do
  225.     if uKeys[b] and (keyNames[b] <> nil) then
  226.       Exit;
  227.   AnyKeyDown := False;
  228. end;
  229.  
  230.  
  231. function GetKeyDown : Byte;
  232. var b : Integer;
  233. begin
  234.   GetKeyDown := 0;
  235.   for b := 1 to 255 do
  236.     if uKeys[b] and (keyNames[b] <> nil) then
  237.     begin
  238.       GetKeyDown := b;
  239.       Exit;
  240.     end;
  241. end;
  242.  
  243.  
  244. procedure ClearKeys;
  245. begin
  246.   FillChar( uKeys, SizeOf( uKeys), 0); { clear the keys array }
  247. end;
  248.  
  249.  
  250. {$F+}
  251. procedure CleanUp;
  252. begin
  253.   ExitProc := uExitProc;
  254.   if uOldInt9 <> nil then
  255.     RemoveKbdHandler;
  256. end;
  257. {$F-}
  258.  
  259.  
  260. begin
  261.   uExitProc := ExitProc;
  262.   ExitProc := @CleanUp;
  263.   uOldInt9 := nil;
  264. end.
  265.